#ifndef ENUMS_H
#define ENUMS_H

#include <QMetaType>

namespace DeviceProtocol {

// 设备角色
enum class Role {
    Device, // 机台设备
    IPC,    // 上位机
};

// 请求结果代码
enum class RC {
    Success,        // 通信流程完成,具体指令完成与否请查看 ExeRtn
    InvalidRequest, // 错误的请求
    AckTimeout,     // 请求响应超时
    ReponesTimeout, // 执行结果或数据响应响应超时
};

// 协议版本
enum class ProtocolVersion : quint8 {
    VT = 0b00000000,
    V0 = 0b00000010,
    V1 = 0b00000100,
    V2 = 0b00001000,
    V3 = 0b00010000,
    V4 = 0b00100000,
    V5 = 0b01000000,
    V6 = 0b10000000,
};

// 端点事件
enum class EndPointEvent {
    OnDisconnected,
    OnMessageReceived,
};

// 执行结果域
enum class ExeRtnDomain {
    Success = 1,                     // 成功
    Unknown = 2,                    // 未知错误
    InvalidRequest = 3,             // 无效请求（命令执行被拒绝：条件错误）
    Timeout = 4,                    // 超时（通信超时，请稍后重试）
    SystemBusy = 5,                 // 系统繁忙（系统当前繁忙，请稍候或稍后重试）
    SystemCrush = 6,                // 系统崩溃（系统当前不可用，请稍后重试）
    DataNotFound = 100              // 数据未找到（该查询无可用数据）
};

// 请求回应域
enum class QnRtnDomain {
    PrepareToExecute = 1,   // 准备执行请求
    RequestRejected = 2,    // 请求被拒绝
    InvalidFlag = 3,    // Flag错误
    InvalidQn = 4,  //QN错误
    InvalidCn = 5, //CN错误
    CRCValidationError = 6, //CRC检验错误
    Unknown = 100           // 未知错误
};

// 设备状态
enum class DeviceState {
    R,  // 运行
    P,  // 暂停
    A,  // 报警
    F,  // 空闲
    I   // 初始化完成
};

// 控制方式
enum class ControlMethod {
    L,  // 本地
    R   // 远程
};

// 上位机命令
enum class IPCCommand {
    DeviceInitialize = 100,     // 用于上位机通知现场机执行初始化动作
    QueryRecipe = 111,          // 用于提取机台的工艺参数
    SetupRecipe = 112,          // 设置机台的工艺参数
    QueryState = 201,           // 启动机台上传运行状态
    PauseHeartBeat = 202,       // 停止机台状态上传
    QueryActionList = 203,      // 查询机台待执行的动作列表
    RemoveAction = 204,         // 删除之前添加的指令动作，当No=-1 的情况下，删除所有指令动作
    QueryDIList = 205,          // 查询指定DI
    QueryActionChecksum = 206,  // 查询动作列表校验和
    FastMotion = 210,           // 快速移动
    FastCutting = 211,          // 快速切割
    AppendSetDO = 212,          // 开启设备
    AppendResetDO = 213,        // 关闭设备
    Execute = 301,              // 上位机启动机台按照添加的指令动作进行执行
    Pause = 302,                // 暂停当前机台的指令动作
    SetDO = 303,                // 开启设备(夹紧)
    ResetDO = 304,              // 关闭设备(松开)
    ClampAllFixture = 305,      // 全部夹紧
    ReleaseAllFixture = 306,    // 全部松开
    Stop = 307,                 // 停止
    SpindleStart  = 308,        // 主轴启动
    SpindleStop  = 309,         // 主轴停止
    ReplyNotify = 903,          // 全部松开
    ReplyData = 904,            // 数据应答命令
};

// 设备响应命令
enum class DeviceCommand {
    ReplyRecipe = 111,          // 上传机台的工艺参数
    ReplyState = 201,           // 机台上传当前设备状态
    ReplyDIList = 205,          // 机台上传设备DI状态
    ReplyActionChecksum = 206,  // 机台上传动作列表校验和
    ReplyFastMotion = 210,      // 回复上位机的动作列表查询指令中的快速移动指令
    ReplyFastCutting = 211,     // 回复上位机的动作列表查询指令中的快速切割指令
    ReplySetDO = 212,           // 回复上位机的动作列表查询指令中的开启设备指令
    ReplyResetDO = 213,         // 回复上位机的动作列表查询指令中的关闭设备指令
    ReplyRequest = 901,         // 机台回应接收的上位机请求命令是否有效
    ReplyExecute = 902,         // 机台回应接收的上位机请求命令执行结果
    ReplyNotify = 903,          // 回应通知命令
    ReplyData = 904,            // 数据应答命令
};

// 协议节点状态
enum class EndPointStatus {
    UnAvailable,
    Available,
    Busy
};

} // namespace DeviceProtocol

// 注册元类型
Q_DECLARE_METATYPE(DeviceProtocol::Role)
Q_DECLARE_METATYPE(DeviceProtocol::RC)
Q_DECLARE_METATYPE(DeviceProtocol::ProtocolVersion)
Q_DECLARE_METATYPE(DeviceProtocol::EndPointEvent)
Q_DECLARE_METATYPE(DeviceProtocol::ExeRtnDomain)
Q_DECLARE_METATYPE(DeviceProtocol::QnRtnDomain)
Q_DECLARE_METATYPE(DeviceProtocol::DeviceState)
Q_DECLARE_METATYPE(DeviceProtocol::ControlMethod)
Q_DECLARE_METATYPE(DeviceProtocol::IPCCommand)
Q_DECLARE_METATYPE(DeviceProtocol::DeviceCommand)
Q_DECLARE_METATYPE(DeviceProtocol::EndPointStatus)

#endif // ENUMS_H
